import json from '@rollup/plugin-json';
import del from 'rollup-plugin-delete';
import terser from '@rollup/plugin-terser';
import commonjs from '@rollup/plugin-commonjs';
import resolve from '@rollup/plugin-node-resolve';
import typescript from '@rollup/plugin-typescript';
import _ from 'lodash';

const defaultExternal = [
    'os', // 操作系统
    'fs', // 文件操作
    'path', // 路径
    'tslib', // 类型库
    'axios', // 请求
    'lodash', // 工具库
    'colors', // 颜色
    'semver', // 版本比较
    'dotenv', // 读取环境变量
    'npmlog', // 日志
    'fs-extra', // 文件操作 基于fs模块
    'fsevents', // 监听文件变化
    'url-join', // 拼接url
    'minimist', // 解析命令行参数
    'inquirer', // 命令行交互
    'commander', // 命令行工具
    'cross-spawn', // 跨平台执行命令
    'path-exists', // 判断文件是否存在
    'node-eval', // 执行node文件
    'detect-port-alt', //检测端口是否被占用
    'validate-npm-package-name', // 校验项目名称
    'ora', // 加载动画

    'vite',
    '@vitejs/plugin-react',

    '@tomatojs/log',
    '@tomatojs/core',
    '@tomatojs/utils',
    '@tomatojs/compile',
    '@tomatojs/commander',

    'webpack',
    'webpack-dev-server',
    'webpackbar', // 进度条
    'html-webpack-plugin',
    'less',
    'less-loader',
    'css-loader',
    'style-loader',
    'ts-loader',
    'ts-node',
    'mini-css-extract-plugin', // 提取css
    'postcss-loader', // 解析css
    'css-minimizer-webpack-plugin', // css压缩
    'terser-webpack-plugin', // js压缩
    'compression-webpack-plugin', // gzip压缩
    'purgecss-webpack-plugin', // 移除未使用的css

    '@babel/core',
    '@babel/preset-env',
    '@babel/plugin-transform-modules-commonjs',

    '@tomatojs/core/package.json',
    '*/package.json',
    '../../package.json',
    '../node_modules/@tomatojs/core/package.json',
];

export const getConfig = config => {
    const isProduction = process.env.NODE_ENV === 'production';
    const isTest = process.env.NODE_ENV === 'test';
    const external = defaultExternal;
    const input = './src/index.ts';

    const baseOutput = {
        // sourcemap: true,
        experimentalMinChunkSize: 1024,
        compact: true, // 压缩代码
        strict: false, // 严格模式
        minifyInternalExports: true, // 压缩内部导出
        preserveModules: true, // 保留模块
        preserveModulesRoot: 'src', // 保留模块根目录
    };

    const tsConfig = {
        tsconfig: false,
        compilerOptions: {
            paths: {
                '@src/*': ['./src/*'],
            },
            target: 'es2017',
            noEmitOnError: true, // 编译出错时退出
            allowSyntheticDefaultImports: true, // 允许导入模块时没有默认导出
            esModuleInterop: true, // 允许直接导入模块
            resolveJsonModule: true, // 允许导入json文件
        },
    };

    const baseWatchConfig = {
        include: ['src/**/*.ts'], // 监听文件
        skipWrite: true, // 跳过写入
        buildDelay: 100, // 构建延迟
    };

    const getCommonPlugins = (tsConfig = {}) => [resolve(), commonjs(), json(), typescript(tsConfig)];
    const getPlugins = config => [isProduction && terser(), ...getCommonPlugins(config)];

    const compileType = [
        {
            input,
            external,
            output: {
                dir: 'cjs',
                format: 'cjs',
                ...baseOutput,
            },
            watch: baseWatchConfig,
            plugins: [...getPlugins(tsConfig), del({targets: ['cjs/*']})],
        },
        {
            input,
            external,
            output: {
                dir: 'esm',
                format: 'es',
                ...baseOutput,
            },
            watch: baseWatchConfig,
            plugins: [...getPlugins(), del({targets: ['esm/*']})],
        },
    ];

    /**
     *  type 声明文件有问题 暂时不生成
     *  问题： 会把js编译出来
     */
    // const types = {
    //     input,
    //     external,
    //     output: {
    //         dir: 'dist/types',
    //         format: 'cjs',
    //     },
    //     plugins: [
    //         ...getCommonPlugins(),
    //         typescript({
    //             include: ['src/**/*.ts'],
    //             tsconfig: false,
    //             noEmitOnError: true, // 编译出错时退出
    //             emitDeclarationOnly: true, // 只生成声明文件
    //             declaration: true, // 生成声明文件
    //             declarationDir: 'dist/types', // 声明文件输出目录
    //             esModuleInterop: true, // 允许直接导入模块
    //             resolveJsonModule: true, // 允许导入json文件
    //         }),
    //     ],
    // };

    if (isTest) {
        return _.merge({}, compileType[0], config);
    } else {
        return compileType.map(v => _.merge({}, v, config));
    }
};
